home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 25 / AACD 25.iso / AACD / Magazine / Backups / FBackNG / getopt.c < prev    next >
Encoding:
C/C++ Source or Header  |  2001-08-30  |  1.3 KB  |  59 lines

  1. /* [Open Source] getopt.c */
  2.  
  3. #include <stdio.h>
  4. #include <string.h>
  5.  
  6. /* Avoid possible compiler warning if we simply redefine NULL or EOF */
  7. #define XNULL   0
  8. #define XEOF (-1)
  9.  
  10. #define ERR(szz,czz) if(opterr){fprintf(stderr,"%s%s%c\n",argv[0],szz,czz);}
  11.  
  12. int   opterr = 1;
  13. int   optind = 1;
  14. int   optopt;
  15. char  *optarg;
  16.  
  17. int getopt(int argc, char **argv, char *opts)
  18. {
  19.    static int sp = 1;
  20.    register int c;
  21.    register char *cp;
  22.  
  23.    if(sp == 1)
  24.       if(optind >= argc ||
  25.          argv[optind][0] != '-' || argv[optind][1] == '\0')
  26.          return(XEOF);
  27.       else if(strcmp(argv[optind], "--") == XNULL) {
  28.          optind++;
  29.          return(XEOF);
  30.       }
  31.    optopt = c = argv[optind][sp];
  32.    if(c == ':' || (cp=strchr(opts, c)) == XNULL) {
  33.       ERR(": illegal option -- ", c);
  34.       if(argv[optind][++sp] == '\0') {
  35.          optind++;
  36.          sp = 1;
  37.       }
  38.       return('?');
  39.    }
  40.    if(*++cp == ':') {
  41.       if(argv[optind][sp+1] != '\0')
  42.          optarg = &argv[optind++][sp+1];
  43.       else if(++optind >= argc) {
  44.          ERR(": option requires an argument -- ", c);
  45.          sp = 1;
  46.          return('?');
  47.       } else
  48.          optarg = argv[optind++];
  49.       sp = 1;
  50.    } else {
  51.       if(argv[optind][++sp] == '\0') {
  52.          sp = 1;
  53.          optind++;
  54.       }
  55.       optarg = XNULL;
  56.    }
  57.    return(c);
  58. }
  59.